#define PUDGE_META_LAZY_SPEC BOOST_PP_ITERATION()

// template<class T0,...> struct result { typedef typename Function::result<T0,...>::type type; };

template<BOOST_PP_ENUM_PARAMS(PUDGE_META_LAZY_SPEC, class T)>
struct result<BOOST_PP_ENUM_PARAMS(PUDGE_META_LAZY_SPEC, T)>
{
	typedef typename Function::result<BOOST_PP_ENUM_PARAMS(PUDGE_META_LAZY_SPEC, T)>::type type;
};

//template<class T0,class T1> 
//typename call<Tuple,tuple<T0&,T1&>>::result_type operator()(T0 & t0, T1 & t1)
//{
//	typedef tuple<T0&,T1&> args_type;
//	return call<Tuple,args_type>()(function_, tuple_, args_type(t0,t1));
//}

#define PUDGE_META_LAZY_CTUPLE(Z,N,D) T ## N&
#define PUDGE_META_LAZY_CARGS(Z,N,D) T ## N & t ## N
template<BOOST_PP_ENUM_PARAMS(PUDGE_META_LAZY_SPEC, class T)>
typename call<Tuple,tuple<BOOST_PP_ENUM(PUDGE_META_LAZY_SPEC,PUDGE_META_LAZY_CTUPLE,)>>::result_type
	operator()(BOOST_PP_ENUM(PUDGE_META_LAZY_SPEC,PUDGE_META_LAZY_CARGS,))
{
	typedef tuple<BOOST_PP_ENUM(PUDGE_META_LAZY_SPEC,PUDGE_META_LAZY_CTUPLE,)> args_type;
	return call<Tuple,args_type>()
		(	function_
		,	tuple_
		,	args_type(BOOST_PP_ENUM_PARAMS(PUDGE_META_LAZY_SPEC, t)));
}
#undef PUDGE_META_LAZY_CTUPLE
#undef PUDGE_META_LAZY_CARGS

#undef PUDGE_META_LAZY_SPEC